package ar.uba.fi.algo3.algoTank.TesteosAlgoTank;

import ar.uba.fi.algo3.algoTank.Objetos.Bloque;
import ar.uba.fi.algo3.algoTank.Objetos.BloqueConcreto;
import ar.uba.fi.algo3.algoTank.Objetos.Direccion;
import ar.uba.fi.algo3.algoTank.Objetos.Posicion;
import ar.uba.fi.algo3.algoTank.Objetos.Proyectil;
import ar.uba.fi.algo3.algoTank.Objetos.ProyectilAmetralladora;
import ar.uba.fi.algo3.algoTank.Objetos.Territorio;
import ar.uba.fi.algo3.algoTank.Objetos.Tanques.AlgoTank;
import ar.uba.fi.algo3.algoTank.Objetos.Tanques.MirageTank;

import junit.framework.TestCase;

public class TestTerritorio extends TestCase {

	private Territorio territorio;
	private BloqueConcreto bloque;
	private AlgoTank algotank;
	private MirageTank unTanque;
	private Proyectil proyectil;
	
	protected void setUp() {
		
		territorio = new Territorio();
		algotank= new AlgoTank(new Posicion(11,11), territorio);
		unTanque= new MirageTank(new Posicion(6,6), territorio);
		proyectil= new ProyectilAmetralladora();
	}


	public void testUbicarObjetoEnPosicionFueraTerritorio(){
		
		bloque = new BloqueConcreto(new Posicion(1600,1800), territorio);
		assertFalse(territorio.ubicacionLibre(bloque.getUbicacion()));
	
	}
	
	public void testUbicarObjetoEnPosicionDentroTerritorio(){
	
		bloque = new BloqueConcreto(new Posicion(300,100),territorio);
		assertFalse(territorio.fueraDelTerritorio(bloque.getUbicacion()));
	
	
	}
	
	public void testUbicarObjetosSuperPuestos(){
		
		//primer Bloque
		bloque = new BloqueConcreto(new Posicion(2,2), territorio);
		
		//Segundo Bloque
		Bloque otroBloque = new BloqueConcreto(new Posicion(2,3), territorio);
		
		//agrego el Primer Bloque a las paredes.
		territorio.addObjeto(bloque);
		
		//Pruebo que no sea una ubicacion valida la del segundo bloque
		assertFalse(territorio.ubicacionLibre(otroBloque.getUbicacion()));
	}
	

	public void testObtenerObjetos(){
		
		bloque = new BloqueConcreto(new Posicion(3,2), territorio);
		territorio.addObjeto(bloque);
		territorio.addObjeto(algotank);
		territorio.addObjeto(unTanque);
		territorio.addObjeto(proyectil);
		assertEquals(territorio.getObjetos().size(),4);
		
		territorio.deleteObjeto(unTanque);
		assertEquals(territorio.getObjetos().size(),3);
		
	}
	public void testActulizarObjetos(){
		
		ProyectilAmetralladora proyectil = new ProyectilAmetralladora(new Posicion(2,2),territorio);
		
		proyectil.setDuenio(algotank);
		bloque = new BloqueConcreto(new Posicion(3,2), territorio);
		territorio.addObjeto(bloque);
		algotank=new AlgoTank(new Posicion(0,0),territorio);
		territorio.addObjeto(algotank);
		territorio.addObjeto(proyectil);
		
		
		assertEquals(territorio.getObjetos().size(),3);
		
		proyectil.getMovimiento().setDireccion(new Direccion());
		proyectil.getMovimiento().getDireccion().derecha();
		algotank.disparar();
		territorio.actualizar();
//		assertFalse(bloque.estaVivo());
		assertFalse(proyectil.estaVivo());
		System.out.println(territorio.getObjetos());
//		assertEquals(territorio.getObjetos().size(),0);
		
		
	}
	
	public void testLimpiarMuertos(){
		
		bloque = new BloqueConcreto(new Posicion(100,2), territorio);
		ProyectilAmetralladora proyectil = new ProyectilAmetralladora(new Posicion(2,2),territorio);
		territorio.addObjeto(bloque);
		territorio.addObjeto(proyectil);
		territorio.addObjeto(algotank);
		territorio.addObjeto(unTanque);
		proyectil.getMovimiento().setDireccion(new Direccion());
		unTanque.setObjetivo(algotank.getUbicacion());
		//me fijo q agregue todos a la lista de objetos
		assertEquals(territorio.getObjetos().size(),4);
		
		bloque.morir();
		algotank.morir();
		unTanque.morir();
		proyectil.morir();
		territorio.actualizar();
		
		//queda 1 por el item que tira el tanque enemigo al morir
		assertEquals(territorio.getObjetos().size(),1);
		
		
	
	}
	
	public void testColisones(){
		
		Proyectil bala = new ProyectilAmetralladora(new Posicion(30,20),territorio);
		Proyectil bala2 = new ProyectilAmetralladora(new Posicion(40,50),territorio);
		 
		territorio.addObjeto(bala);
		territorio.addObjeto(bala2);
		territorio.addObjeto(algotank);
		
		//AlgoTank algo = new AlgoTank(new Posicion(30,20),territorio);
		MirageTank enemigo = new MirageTank(new Posicion(30,20), territorio);
		territorio.addObjeto(enemigo);
		
		
		territorio.resolverColisiones();
		
		assertFalse(bala.estaVivo());
		assertTrue(bala2.estaVivo());
		
//		assertTrue(enemigo.estaVivo());
		
/*		Proyectil bala4 = new ProyectilAmetralladora(new Posicion(30,23),territorio);
		territorio.addObjeto(bala4);
		
		territorio.resolverColisiones();
		assertTrue(enemigo.estaVivo());

		Proyectil bala5 = new ProyectilAmetralladora(new Posicion(30,23),territorio);
		territorio.addObjeto(bala5);
		
		territorio.resolverColisiones();
		assertTrue(enemigo.estaVivo());

		Proyectil bala6 = new ProyectilAmetralladora(new Posicion(30,23),territorio);
		territorio.addObjeto(bala6);
		
		territorio.resolverColisiones();
		assertTrue(enemigo.estaVivo());

		Proyectil bala7 = new ProyectilAmetralladora(new Posicion(30,23),territorio);
		territorio.addObjeto(bala7);
	
		territorio.resolverColisiones();
		assertFalse(enemigo.estaVivo());
*/
	}
	
	
	public void testObtenerParedes(){
		
		bloque = new BloqueConcreto(new Posicion(100,2), territorio);
		territorio.addObjeto(bloque);
		assertEquals(territorio.obtenerParedes().size(),1);
		
	}
	

}
